package com.jshcbd.mvp_kt_demo.base.activity

import android.os.Bundle
import android.view.LayoutInflater
import androidx.viewbinding.ViewBinding
import com.dylanc.viewbinding.base.inflateBindingWithGeneric
import com.gyf.barlibrary.ImmersionBar
import com.jshcbd.mvp_kt_demo.R
import com.jshcbd.mvp_kt_demo.app.MyApplication
import com.jshcbd.mvp_kt_demo.base.mvp.BasePresenter
import com.trello.rxlifecycle2.components.support.RxAppCompatActivity
import org.greenrobot.eventbus.EventBus
import java.lang.reflect.Method
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type

/**
 * 这里采用[com.trello.rxlifecycle2.RxLifecycle]框架来管理RxJava订阅生命周期
 * 将Activity基类继承自[RxAppCompatActivity] 考虑到Java没有多继承，若随着项目需要可能会使用到其他的第三方库需要继承，
 * 最简单的方法就是把[RxAppCompatActivity]的源码直接对应填到BaseActivity 即可
 */
abstract class BaseActivity<VB : ViewBinding, P : BasePresenter<*, *>?> : RxAppCompatActivity(),
    IActivity {
    //获取VB
    lateinit var binding: VB
    protected var mPresenter: P? = null

    /*** 沉浸式状态栏的管理  */
    protected var mImmersionBar: ImmersionBar? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mPresenter = createPresenter()
        try {
            initVB()
            //初始化沉浸式
            if (isImmersionBarEnabled()) {
                //设置沉浸式状态栏
                initImmersionBar()
            }
            //如果要使用 EventBus 请将此方法返回 true
            if (useEventBus()) {
                //注册 EventBus
                EventBus.getDefault().register(this)
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        initData(savedInstanceState)

        //将Activity 添加到集合中
        MyApplication.addActivity(this)

    }

    private fun initVB() {
        binding = inflateBindingWithGeneric(layoutInflater)
        setContentView(binding.root)
    }

    /**
     * 设置沉浸式状态栏
     */
    protected fun initImmersionBar() {
        //初始化状态栏，当状态栏设置白色造成系统图标不可见（设置字体）
        mImmersionBar = ImmersionBar.with(this)
            .statusBarColor(R.color.purple_200)
            .fitsSystemWindows(true)
        mImmersionBar?.init()
    }

    /**
     * 是否可以使用沉浸式
     *
     * @return the boolean
     */
    protected fun isImmersionBarEnabled(): Boolean {
        return true
    }

    protected abstract fun createPresenter(): P

    override fun onDestroy() {
        super.onDestroy()
        //如果要使用 EventBus 请将此方法返回 true
        if (useEventBus()) {
            //解除注册 EventBus
            EventBus.getDefault().unregister(this)
        }
        if (mImmersionBar != null) {
            //必须调用该方法，防止内存泄漏
            mImmersionBar!!.destroy()
        }
        if (mPresenter != null) {
            mPresenter?.detachView()
        }
    }

    /**
     * 子类Activity要使用EventBus只需要重写此方法返回true即可
     *
     * @return
     */
    override fun useEventBus(): Boolean {
        return false
    }
}